﻿using System;

namespace MoroMoro.Samples.ToDoList.Base.Application
{
    partial class OperationScript<TOutputs, TErrors>
    {
        /// <summary>
        /// 操作スクリプトの実行結果を表します。
        /// </summary>
        /// <seealso cref="OperationScript&lt;TOutputs, TErrors&gt;"/>
        /// <seealso cref="OperationOutputs"/>
        /// <seealso cref="OperationErrors"/>
        protected sealed class ExecutionResult
        {
            /// <summary>
            /// 操作の出力を使用して、<see cref="ExecutionResult"/> クラスの新しいインスタンスを初期化します。
            /// </summary>
            /// <param name="outputs">操作の出力。</param>
            /// <exception cref="System.ArgumentNullException">outputs が null です。</exception>
            public ExecutionResult(TOutputs outputs)
            {
                if (outputs == null)
                {
                    throw new ArgumentNullException("outputs");
                }
                Outputs = outputs;
            }

            /// <summary>
            /// 操作のエラーを使用して、<see cref="ExecutionResult"/> クラスの新しいインスタンスを初期化します。
            /// </summary>
            /// <param name="errors">操作のエラー。</param>
            /// <exception cref="System.ArgumentNullException">errors が null です。</exception>
            public ExecutionResult(TErrors errors)
            {
                if (errors == null)
                {
                    throw new ArgumentNullException("errors");
                }
                Errors = errors;
            }


            /// <summary>
            /// 操作の出力を取得します。
            /// </summary>
            public readonly TOutputs Outputs;

            /// <summary>
            /// 操作のエラーを取得します。
            /// </summary>
            public readonly TErrors Errors;


            /// <summary>
            /// 操作が成功したかどうかを示す値を取得します。
            /// </summary>
            /// <returns>操作が成功した場合は true、それ以外は false。</returns>
            public bool IsSuccess
            {
                get
                {
                    return (Outputs != null);
                }
            }

            /// <summary>
            /// 操作が失敗したかどうかを示す値を取得します。
            /// </summary>
            /// <returns>操作が失敗した場合は true、それ以外は false。</returns>
            public bool IsError
            {
                get
                {
                    return (Errors != null);
                }
            }


            /// <summary>
            /// 操作の出力を元に <see cref="ExecutionResult"/> クラスの新しいインスタンスを生成します。
            /// </summary>
            /// <param name="outputs">操作の出力。</param>
            /// <returns><see cref="ExecutionResult"/> クラスの新しいインスタンス。</returns>
            /// <exception cref="System.ArgumentNullException">outputs が null です。</exception>
            public static implicit operator ExecutionResult(TOutputs outputs)
            {
                return new ExecutionResult(outputs);
            }

            /// <summary>
            /// 操作のエラーを元に <see cref="ExecutionResult"/> クラスの新しいインスタンスを生成します。
            /// </summary>
            /// <param name="errors">操作のエラー。</param>
            /// <returns><see cref="ExecutionResult"/> クラスの新しいインスタンス。</returns>
            /// <exception cref="System.ArgumentNullException">errors が null です。</exception>
            public static implicit operator ExecutionResult(TErrors errors)
            {
                return new ExecutionResult(errors);
            }
        }
    }
}
